import axios from 'axios'
import JsonBigint from 'json-bigint'
import store from '@/store'
import router from '@/router'
const MyAxios = axios.create({
  baseURL: 'http://toutiao-app.itheima.net/v1_0/',
  // 自定义格式化后台返回的数据
  transformResponse: [function (data) {
    try {
      // JBIG.parse=> 功能和JSON.parse方法类似，但是存在大数不会失真
      return JsonBigint.parse(data)
    } catch (error) {
      console.warn(error)
      return data
    }
  }]

})
// 添加请求拦截器
MyAxios.interceptors.request.use(function (config) {
  // 添加统一的token
  // 如果vuex有token 并且config.url
  // console.log(config)
  if (store.state.userToken.token && config.url !== 'authorizations') {
    config.headers.Authorization = `Bearer ${store.state.userToken.token}`
  }
  // 处理接口版本问题
  if (config.url === 'articles') {
    config.baseURL = config.baseURL.replace('v1_0', 'v1_1')
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
MyAxios.interceptors.response.use(function (response) {
  // 简化后台返回的数据
  const _Res = {
    status: response.status,
    data: response.data?.data
  }
  // console.log('aa', _Res)
  return _Res
}, async function (error) {
  /**
   * 1. 没有登陆过 =》跳回登录页登录
   * 2. 登陆过=》
   *    1. token失效了，但是refresh_token没有失效=》根据refresh_token获取新token
   *    2. token和refresh_token都失效了=》跳回登录页登录
   */
  const loginConf = { path: '/login', query: { redirectUrl: router.currentRoute.path } }
  try {
    if (error.response && error.response.status === 401) {
      const { userToken } = store.state
      // 第一种：如果没有登陆过 那么token和refresh_token就肯定为空 就跳转回登录页面
      if (!userToken.token || !userToken.refresh_token) {
        router.push(loginConf)
        return Promise.reject(error)
      }
      // 第二种 token失效了 但是 ref没有失效  就去请求接口
      const { data } = await MyAxios.put('authorizations', null, {
        headers: {
          Authorization: 'Bearer ' + userToken.refresh_token
        }
      })
      // 更新本地vuex的token
      store.commit('setToken', {
        token: data.token,
        refresh_token: userToken.refresh_token
      })
      // 接着让他重新请求一遍
      return MyAxios(error.config)
    }
  } catch (error) {
    // 返回log登录页面
    router.push(loginConf)
    return Promise.reject(error)
  }
  return Promise.reject(error)
})
// 封装vue插件
const MyAxiosPlug = function (Vue) {
  // 原型上定义全局方法
  Vue.prototype.request = MyAxios
}
// 导出插件
export { MyAxiosPlug }
export default MyAxios
